草庐IT

C++ 11:std::thread池化?

全部标签

c++ - 将 std::variant 转换为模板类实例的 std::tuple

transform_v2t下面代码中的函数构建了模板类A实例的元组:templatestructA{Tval;};templateclassT,std::size_t...index>inlineconstexprautotransform_v2t(std::index_sequence){returnstd::make_tuple(T>()...);}templateclassT>inlineconstexprautotransform_v2t(){returntransform_v2t(std::make_index_sequence>());}typedefstd::varian

c++ - std::mutex 是否支持拥有它的线程?

我试图了解如何spinlockmutex作品,所以我写了一个简单的代码(如下所示)来测量来自受自旋锁(或std::)互斥锁保护的不同线程。令人惊讶的是,它显示(至​​少在gcc中)std::mutex(与自旋锁互斥锁相反)似乎有利于拥有它的线程,导致非常小的指令交错(最多5%),除非有问题的指令非常快(比如递增计数器)。在那种情况下,我们甚至可以获得50%。自旋锁互斥体至少提供80%(通常超过90%)。这是众所周知的事实吗?或者我下面的代码可能有错误?我的意思是,我知道经验法则说互斥体应该始终锁定最短的时间。但我确信是这样的,因为我们想减少线程的序列化,而不是因为std::mutex有

c++ - 为什么我不能将此对象推送到我的 std::list 中?

刚开始用C++编程。我创建了一个Point类、一个std::list和一个迭代器,如下所示:classPoint{public:intx,y;Point(intx1,inty1){x=x1;y=y1;}};std::listpointList;std::list::iteratoriter;然后我将新点推送到pointList。现在,我需要遍历pointList中的所有点,所以我需要使用迭代器进行循环。这就是我搞砸的地方。for(iter=pointList.begin();iter!=pointList.end();iter++){PointcurrentPoint=*iter;gl

C++ 自动类型转换为 std::string 和 char* 的区别

作为学习练习,我一直在研究C++中的自动类型转换是如何工作的。我知道通常应该避免自动类型转换,但我还是想通过了解它的工作原理来增加我对C++的了解。我已经创建了一个可以自动转换为std::string的StdStringConverter类,但是编译器(Debian上的g++4.3.4)似乎没有这样做将对象与真实的std::string进行比较时的转换(请忽略缺少按引用传递和不必要地创建临时对象的情况):#includeclassStdStringConverter{public:explicitStdStringConverter(std::stringname):m_name(na

c++ - "thread-local storage not supported for this target",适合#ifdef?

由于每个编译器都有自己的线程本地存储版本,我最终为它创建了一个宏。现在唯一的问题是GCC(关闭了pthreads),这给了我:“此目标不支持线程本地存储”很公平,因为在这种情况下pthreads实际上是关闭的。问题是,是否有一种通用的方法可以使用一些宏来检测这一点,例如#ifdef__GCC_XXX_NO_THREADS_XXX?编辑:请参阅下面接受的答案。另外,这是我的懒惰解决方案:$touchtest.c$gcc-E-dMtest.c>out.1$gcc-pthread-E-dMtest.c>out.2$diffout.*28a29>#define_REENTRANT1这是在Mac

C++,重载 std::swap,编译器错误,VS 2010

我想在我的模板类中重载std::swap。在下面的代码中(简化)#ifndefPoint2D_H#definePoint2D_HtemplateclassPoint2D{protected:Tx;Ty;public:Point2D():x(0),y(0){}Point2D(constT&x_,constT&y_):x(x_),y(y_){}....public:voidswap(Point2D&p);};templateinlinevoidswap(Point2D&p1,Point2D&p2){p1.swap(p2);}namespacestd{templateinlinevoidsw

c++ - std::vector 的 Typedef 和 ostream 运算符

我创建了一个Chromosome类,它最终只是一个带有ostream运算符的vector包装器,所以我决定改用typedefvector。但是,我在使用模板化的ostream运算符时遇到了问题……这是最好的方法吗?(我见过一些方法,但都没有奏效)templateclassChromosome{public:typedeftypenamestd::vectortype;typedeftypenamestd::pairptr_pair;};template//line19below:std::ostream&operator::type&chromosome){for(autoiter=c

c++ - 复制 std::ofstream 追加内容

我正在使用std::ofstream进行跟踪输出。出于某些原因,有时我想将附加在std::ofstream末尾(尚未刷新或关闭)的内容复制到另一个std::ofstream中;您有什么办法可以实现吗?谢谢 最佳答案 Tee从Boost.Iostreams过滤可以将输出流分成两部分。这是一个深受JohannesSchaub给出的启发的例子在他的回答中here.#include#include#include#includeintmain(){namespaceio=boost::iostreams;typedefio::tee_dev

c++ - 简单的 DirectX 11 程序运行时错误

我是DirectX11的新手,我已经设法在我的书中找到了绘制三角形一章。我写了这段代码,但出现运行时错误:“DirectX11.exe中0x00cd14e6处的未处理异常:0xc0000005:访问冲突读取位置0x00000000。”我的编译器显示错误出在InitPipeline函数中,但我找不到那里的错误。我做错了什么?代码:#include#include#include#include#include#pragmacomment(lib,"d3d11.lib")#pragmacomment(lib,"d3dx11.lib")#pragmacomment(lib,"d3dx10.l

c++ - Visual Studio 11 Developer Preview 的开发适用性

我最近下载了VisualStudio11DeveloperPreview,它看起来棒极了。我阅读了下载页面上的细则,上面写着:VisualStudio11DeveloperPreviewisprereleasesoftwareandshouldnotbeusedinproductionscenarios.我将仅使用VS11的C++编译器/IDE,所以有人知道有哪些错误会阻止我在生产场景中使用VS11吗?我真的很想开始使用它,我不知道是C++部分没有完成,还是只是一些与我无关的不适合该领域的TeamFoundationSomethingorother。 最佳答